package com.bjpowernode.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.bjpowernode.mapper.TClueMapper;
import com.bjpowernode.query.ClueExcelQuery;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Excel线索导入监听器
 * 实现EasyExcel的ReadListener接口，用于处理Excel文件读取过程中的数据解析、缓存和批量保存逻辑
 */
public class ClueExcelListener implements ReadListener<ClueExcelQuery> {
    /**
     * 批量保存阈值 - 当累积数据量达到此数量时执行一次数据库批量保存
     */
    private static final int BATCH_COUNT = 100;

    /**
     * Excel导入数据临时缓存列表
     * 用于暂存解析后的Excel行数据，达到BATCH_COUNT时触发批量保存
     */
    private List<ClueExcelQuery> clueExcelQueryList = new ArrayList<>(BATCH_COUNT);

    /**
     * 线索数据库操作Mapper
     * 用于执行线索数据的批量保存操作
     */
    private TClueMapper tClueMapper;

    /**
     * 当前登录用户ID
     * 用于设置导入线索的创建者ID
     */
    private Integer loginUserId;

    /**
     * 构造方法 - 初始化监听器必要依赖
     * @param tClueMapper 线索数据库操作Mapper对象
     * @param loginUserId 当前登录用户ID
     */
    public ClueExcelListener(TClueMapper tClueMapper, Integer loginUserId) {
        this.tClueMapper = tClueMapper;
        this.loginUserId = loginUserId;
    }


    /**
     * 每行数据解析回调方法
     * 当Excel解析到一行数据时触发，负责设置行数据的公共字段并加入缓存列表
     * @param clueExcelQuery 当前解析到的Excel行数据对象
     * @param analysisContext EasyExcel分析上下文（包含读取配置等信息）
     */
    @Override
    public void invoke(ClueExcelQuery clueExcelQuery, AnalysisContext analysisContext) {
        // 设置线索创建者为当前登录用户
        clueExcelQuery.setCreateBy(loginUserId);
        // 设置线索创建时间为当前系统时间
        clueExcelQuery.setCreateTime(new Date());

        // 将当前行数据加入缓存列表
        clueExcelQueryList.add(clueExcelQuery);

        // 当缓存列表达到批量保存阈值时，执行数据库批量保存并重置缓存列表
        if (clueExcelQueryList.size() >= BATCH_COUNT) {
            tClueMapper.saveExcel(clueExcelQueryList);
            clueExcelQueryList = new ArrayList<>(BATCH_COUNT);
        }
    }

    /**
     * 所有数据解析完成回调方法
     * 在Excel文件所有行数据解析完成后触发，用于保存缓存中剩余的未批量保存数据
     * @param analysisContext EasyExcel分析上下文
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 保存最后一批不足BATCH_COUNT的数据
        tClueMapper.saveExcel(clueExcelQueryList);
    }
}
